home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / TSR3.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  6KB  |  240 lines

  1. ;**********************************;
  2. ; WASM TSR Support, Keyboard Trap  ;
  3. ; By Eric Tauck                    ;
  4. ;                                  ;
  5. ; Defines:                         ;
  6. ;                                  ;
  7. ;   Trap16  hook interrupt 16      ;
  8. ;   Free16  release interrupt 16   ;
  9. ;   Okay16  verify interrupt 16    ;
  10. ;                                  ;
  11. ; Requires:                        ;
  12. ;                                  ;
  13. ;   INTR.ASM                       ;
  14. ;   SHIFT.ASM                      ;
  15. ;**********************************;
  16.  
  17. ; Note: program must define: TSR_SHIFT and TsrKey.
  18.  
  19.         jmp     _tsr3_end
  20.  
  21. _tsr_within     DB      0       ;reentrancy flag
  22. _tsr_func       DB      ?       ;primary function
  23. _tsr_func2      DB      ?       ;secondary function
  24.  
  25. _tsr_int16      LABEL   DWORD   ;original interrupt
  26.                 DS      4
  27.  
  28. ;========================================
  29. ; Macro to hook the INT 16H hander.
  30.  
  31. Trap16  MACRO
  32.  
  33. ;--- save old interrupt
  34.  
  35.         mov     al, 16H                 ;interrupt number
  36.         call    IntGet                  ;get interrupt
  37.         mov     WORD _tsr_int16, bx     ;save segment
  38.         mov     WORD _tsr_int16+2, dx   ;save offset
  39.  
  40. ;--- hook new interrupt
  41.  
  42.         mov     al, 16H                 ;interrupt number
  43.         mov     dx, ds                  ;segment
  44.         mov     bx, OFFSET _tsr_key     ;offset
  45.         call    IntSet                  ;set interrupt
  46.         ENDM
  47.  
  48. ;========================================
  49. ; Macro to unhook the INT 16H handler.
  50. ;
  51. ; In: seg= TSR segment address in a
  52. ;          register or variable.
  53.  
  54. Free16  MACRO   seg
  55.         push    ds
  56.         mov     ds, seg
  57.         mov     bx, WORD _tsr_int16     ;load offset
  58.         mov     dx, WORD _tsr_int16+2   ;load segment
  59.         pop     ds
  60.         mov     al, 16H                 ;interrupt number
  61.         call    IntSet                  ;restore interrupt
  62.         ENDM
  63.  
  64. ;========================================
  65. ; Macro to check that INT 16 can be
  66. ; unhooked with Free16.
  67. ;
  68. ; In: seg= TSR segment address in a
  69. ;          register or variable.
  70. ;
  71. ; Out: ZY= set if okay.
  72.  
  73. Okay16  MACRO   seg
  74.         push    seg
  75.         mov     al, 16H                 ;interrupt number
  76.         call    IntGet                  ;get interrupt address
  77.         pop     ax
  78.         cmp     bx, OFFSET _tsr_key     ;check offset
  79.         jne     _oky161
  80.         cmp     dx, ax                  ;check segment
  81. _oky161
  82.         ENDM
  83.  
  84. ;========================================
  85. ; Check if keystroke is in table.
  86. ;
  87. ; In: AX= keystroke.
  88. ;
  89. ; Out: CY= set if found; AX= routine
  90. ;      address.
  91. ;
  92. ; All registers and flags are preserved
  93. ; if the key is not found (except CY).
  94.  
  95. _tsr_check PROC NEAR
  96.         pushf
  97.         push    bx
  98.  
  99. ;--- search table for key match
  100.  
  101.         mov     bx, OFFSET TsrKey
  102.         jmps    _tsrck2
  103.  
  104. _tsrck1 seg     cs
  105.         cmp     [bx], ax
  106.         je      _tsrck4
  107.         add     bx, 4
  108. _tsrck2 seg     cs
  109.         cmp     WORD [bx], 0
  110.         jne     _tsrck1
  111.  
  112. ;--- key not found
  113.  
  114. _tsrck3 pop     bx
  115.         popf
  116.         clc
  117.         ret
  118.  
  119. ;--- check if shift matches
  120.  
  121. _tsrck4 push    ax
  122.         call    KeyShf
  123.         and     ax, TSR_SHIFT
  124.         cmp     ax, TSR_SHIFT
  125.         pop     ax
  126.         jne     _tsrck3
  127.  
  128. ;--- hot key and shift state matches
  129.  
  130.         seg     cs
  131.         mov     ax, [bx + 2]
  132.         pop     bx
  133.         popf
  134.         stc
  135.         ret
  136.         ENDP
  137.  
  138. ;========================================
  139. ; Hot key handler.
  140. ;
  141. ; In: AX= address of service routine.
  142.  
  143. _tsr_hand PROC  NEAR
  144.         pushf
  145.         push    bx
  146.         push    cx
  147.         push    dx
  148.         push    di
  149.         push    si
  150.         push    bp
  151.         push    ds
  152.         push    es
  153.         mov     dx, cs          ;load segment registers
  154.         mov     ds, dx
  155.         mov     es, dx
  156.         inc     _tsr_within     ;block
  157.         call    ax              ;call routine
  158.         dec     _tsr_within     ;unblock
  159.         pop     es
  160.         pop     ds
  161.         pop     bp
  162.         pop     si
  163.         pop     di
  164.         pop     dx
  165.         pop     cx
  166.         pop     bx
  167.         popf
  168.         ret
  169.         ENDP
  170.  
  171. ;========================================
  172. ; Interrupt 16H handler.
  173.  
  174. _tsr_key PROC   FAR
  175.         seg     cs
  176.         cmp     _tsr_within, 0  ;check if blocked
  177.         jne     _tsrky1         ;exit if so
  178.  
  179.         seg     cs
  180.         mov     _tsr_func, ah   ;save function number
  181.  
  182.         cmp     ah, 0           ;check if fetch key
  183.         je      _tsrky2
  184.         cmp     ah, 10H         ;check if fetch extended key
  185.         je      _tsrky2
  186.         seg     cs
  187.         mov     _tsr_func2, 1   ;secondary function if needed
  188.         cmp     ah, 1           ;check if keyboard status
  189.         je      _tsrky4
  190.         seg     cs
  191.         mov     _tsr_func2, 10H ;secondary function if needed
  192.         cmp     ah, 11H         ;check if extended keyboard status
  193.         je      _tsrky4
  194.  
  195. _tsrky1 seg     cs
  196.         jmp     _tsr_int16      ;branch to original keyboard handler
  197.  
  198. ;--- fetch keystroke
  199.  
  200. _tsrky2 pushf
  201.         seg     cs
  202.         call    _tsr_int16      ;call keyboard handler
  203.         call    _tsr_check      ;check if hot key
  204.         jc      _tsrky3
  205.         iret
  206.  
  207. ;--- hot key activated on fetch keystroke
  208.  
  209. _tsrky3 call    _tsr_hand       ;call handler
  210.         seg     cs
  211.         mov     ah, _tsr_func   ;reload function
  212.         jmps    _tsrky2
  213.  
  214. ;--- keyboard status
  215.  
  216. _tsrky4 pushf
  217.         seg     cs
  218.         call    _tsr_int16      ;call keyboard handler
  219.         jz      _tsrky5
  220.         call    _tsr_check      ;check if hot key
  221.         jc      _tsrky6
  222. _tsrky5 retf    2               ;return with flags
  223.  
  224. ;--- hot key activated on status call
  225.  
  226. _tsrky6 push    ax
  227.         seg     cs
  228.         mov     ah, _tsr_func2  ;retrieve function
  229.         pushf
  230.         seg     cs
  231.         call    _tsr_int16      ;call keyboard handler
  232.         pop     ax
  233.         call    _tsr_hand       ;call handler
  234.         seg     cs
  235.         mov     ah, _tsr_func   ;reload function
  236.         jmps    _tsrky4
  237.         ENDP
  238.  
  239. _tsr3_end
  240.